#include <stdio.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "iot_gpio.h"
#include "hi_io.h"
#include "iot_pwm.h"
#include "hi_pwm.h"
#include "hi_time.h"

int count1=0;
//音符对照表：
//https://www.cnblogs.com/developer-huawei/p/13959852.html
static const uint16_t g_tuneFreqs[]={
0,
38223, // 1 1046.5,-
34052, // 2 1174.7,--
30338, // 3 1318.5,--
28635, // 4 1396.4,--
25511, // 5 1568,---
22728, // 6 1760,---
20249, // 7 1975.5,---
51021,// 8,5_低音 783.99, 40M=40*1000*1000, 40M/783.99=51021
45454,// 9,6_ 880.00
40495,// 10,7_ 987.77
};
static const uint8_t g_scoreNotes[] = {
// 《兰亭序》简谱：http://www.jianpu.cn/pu/33/33945.htm
    5, 3, 2, 1, 2, 3, 5, 3,  // 兰亭临帖 行书如行云流水
    2, 3, 5, 6, 5, 3, 2, 1,   // 月下门推 心细如你脚步碎
    6, 5, 6, 1, 2, 3, 2, 1,   // 忙不迭 千年碑易拓
    6, 5, 3, 5, 6, 1, 2   
};
// 曲谱时值
static const uint8_t g_scoreDurations[] = {
    4, 4, 4, 4, 4, 4, 4, 4,   // 第一句
    4, 4, 4, 4, 4, 4, 4, 4,   // 第二句
    3, 1, 3, 1, 4, 4, 4, 4,   // 第三句（带附点）
    3, 1, 4, 4, 4, 4, 4 
};

static void beepInit()
{
    hi_gpio_init();
    hi_io_set_func(HI_IO_NAME_GPIO_11,HI_IO_FUNC_GPIO_11_PWM2_OUT);
    hi_io_set_pull(HI_IO_NAME_GPIO_11,HI_IO_PULL_UP);
    //
    hi_pwm_init(HI_PWM_PORT_PWM2);
    hi_pwm_set_clock(PWM_CLK_XTAL);
}

static void beepSingTask(void *arg)
{
    uint32_t tune;
    uint16_t freqDivisor;
    uint32_t tuneInterval;

    beepInit();

    for(size_t i=0;i<sizeof(g_scoreNotes)/sizeof(g_scoreNotes[0]);i++)
    {
        tune=g_scoreNotes[i];
        freqDivisor=g_tuneFreqs[tune];
        tuneInterval=g_scoreDurations[i]*(125 * 1000);
        printf("num=%d, freqDivisor=%d\n", i, freqDivisor);
        hi_pwm_start(HI_PWM_PORT_PWM2,freqDivisor/2,freqDivisor);
        //osDelay(tuneInterval);
        hi_udelay(tuneInterval);
        hi_pwm_stop(HI_PWM_PORT_PWM2);
    }
}

static void BeepEntry(void)
{
    osThreadAttr_t attr={0};
    attr.name="beepSingTask";
    attr.stack_size=4096*2;
    attr.priority=osPriorityNormal;
    if(osThreadNew(beepSingTask,NULL,&attr)==NULL)
    {
        printf("[BeepEntry] create GpioTask failed!\n");
    }
}
SYS_RUN(BeepEntry);